
function jsonStringify(val) {
    const valType = getType(val);
    if (valType == 'Null') {
        return 'null';
    } else if (valType == 'Number') {
        // 12.toString() Invalid 
        return isFinite(val) ? val+'' : 'null';
        // return isFinite(val) ? (val).toString : 'null';
    } else if (valType == 'Boolean') {
        return val.toString();
    } else if (getType(val.JSON) == 'Function') {
        // toJSON() 方法可以将 Date 对象转换为字符串，并格式化为 JSON 数据格式
        return jsonStringify(val.JSON());
    } else if (valType == 'Array') {
        let res = val.map(d => jsonStringify(d))
        return `[${res.join(', ')}]`;
    } else if (valType == 'Object') {
        let res = [];
        for (let key in val) {
            val.hasOwnProperty(key) && res.push(`${jsonStringify(key)}: ${jsonStringify(val[key])}`)
        }
        return `{${res.join(', ')}}`;
    }
    var escMap = {'"': '\\"', '\\': '\\\\', '\b': '\\b', '\f': '\\f', '\n': '\\n', '\r': '\\r', '\t': '\\t'};
    var escFunc = function (m) { return escMap[m] || '\\u' + (m.charCodeAt(0) + 0x10000).toString(16).substr(1); };
    var escReg = /[\\"\u0000-\u001F\u2028\u2029]/g;

    return `"${val.toString().replace(escReg, escFunc)}"`

}

function getType(value) {
    return Object.prototype.toString.call(value).slice(8, -1);
}

const jsonData = {a: { b: { c: 1}}};
const jsonStr = JSON.stringify(jsonData);

console.log(jsonStr);
console.log(jsonStringify(jsonData));